#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
using namespace std;

// 信号练习
// 3
int main()
{
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, 2);
    sigaddset(&set, 40);

    sigprocmask(SIG_BLOCK, &set, nullptr);
    while (true) sleep(1);
    return 0;
}

// 2
// void sigcb(int sig)
// {
//     cout << "当前信号为" << sig << endl;
// }

// int main()
// {
//     struct sigaction sc;
//     sc.sa_flags = 0;
//     sigemptyset(&sc.sa_mask);
//     sc.sa_handler = sigcb;
//     sigaction(SIGINT, &sc, nullptr);

//     while (true) sleep(1);
//     return 0;
// }

//1
// void sigcb(int sig)
// {
//     cout << "当前信号为" << sig << endl;
// }

// int main()
// {
//     signal(SIGINT, sigcb);
//     while (true) sleep(1);
//     return 0;
// }

// int main()
// {
//     signal(SIGCHLD, SIG_IGN);  // 17号信号置为忽略 - 应用层的忽略

//     if (fork() == 0)
//     {
//         // 子进程
//         sleep(5);
//         cout << "子进程退出" << endl;
//         exit(0);
//     }
//     while (true);  // 父进程处理自己的事情
//     return 0;
// }
// void handler(int sig)
// {
//     cout << "捕捉了当前信号: " << sig << endl;
//     // 进行回收
//     while (waitpid(-1, nullptr, WNOHANG));
// }

// // 验证17号信号
// int main()
// {
    // signal(SIGCHLD, handler);

    // if (fork() == 0)
    // {
    //     // 子进程
    //     sleep(5);
    //     cout << "子进程退出" << endl;
    //     exit(0);
    // }

//     while (true);  // 父进程处理自己的事情
//     // int status;
//     // wait(&status);
//     // cout << (status&0x7f) << endl;  // 最后七位-信号  等待验证不可，已经置为0了
//     return 0;
// }

// 引入 volatile关键字
// volatile int flag = 0;  // 告诉编译器此变量不可被优化

// void handler(int sig)
// {
//     (void)sig;
//     cout << "flag由" << flag << "变为1" << endl;
//     flag = 1;
// }
// int main()
// {
//     signal(2, handler);  // 利用2号信号捕捉函数对flag参数进行修改
//     while (true)
//     {
//         if (flag) break;
//     }
//     cout << "程序正常退出,flag为" << flag << endl;
//     return 0;
// }
// void PrintPending()
// {
//     sigset_t set;
//     sigpending(&set);
//     for (int i = 1; i <= 31; ++i)
//     {
//         if (sigismember(&set, i)) cout << "1";
//         else cout << "0";
//     }
//     cout << endl;
// }

// void handler(int sig)
// {
//     cout << "捕捉了当前信号: " << sig << endl;
//     int count = 10;
//     while (true)
//     {
//         PrintPending();
//         count--;
//         if (!count) break;
//         sleep(1);
//     }
// }

// int main()
// {
//     // 利用另一个信号捕捉接口去注册2号信号的自定义处理函数
//     struct sigaction sa, oldsa;
//     //先将内部的信号集清空一下
//     sigemptyset(&sa.sa_mask);
//     sa.sa_flags = 0;
//     sa.sa_handler = handler;  // 注册自定义函数

//     // 将345678加入屏蔽信号集
//     for (int i = 3; i < 9; ++i) sigaddset(&sa.sa_mask, i);

//     // 加载
//     sigaction(2, &sa, &oldsa);
//     cout << "2号信号默认的处理函数->" << (int)(oldsa.sa_handler) << endl;

//     while (true) sleep(1);  // 主程序保持不退出，持续接收信号

//     return 0;
// }